home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / boot / netBoot / sun4.md / RCS / standalloc.c,v < prev    next >
Encoding:
Text File  |  1989-06-20  |  7.5 KB  |  328 lines

  1. head     1.1;
  2. branch   ;
  3. access   ;
  4. symbols  ;
  5. locks    mendel:1.1; strict;
  6. comment  @ * @;
  7.  
  8.  
  9. 1.1
  10. date     89.06.19.17.53.16;  author mendel;  state Exp;
  11. branches ;
  12. next     ;
  13.  
  14.  
  15. desc
  16. @fg
  17. :w!
  18. @
  19.  
  20.  
  21.  
  22. 1.1
  23. log
  24. @Initial revision
  25. @
  26. text
  27. @/*    standalloc.c    1.22    88/02/08    */
  28.  
  29. /*
  30.  * Copyright (c) 1985 by Sun Microsystems, Inc.
  31.  */
  32.  
  33. /*
  34.  * standalloc.c
  35.  *
  36.  * ROM Monitor's routines for allocating resources needed on a temporary
  37.  * basis (eg, for initialization or for boot drivers).
  38.  *
  39.  * Note, all requests are rounded up to fill a page.  This is not a
  40.  * malloc() replacement!
  41.  */
  42.  
  43. /* This flag causes printfs */
  44. #undef PD
  45.  
  46. #ifdef sun4
  47. #include <mon/cpu.map.h>
  48. #else
  49. #include <mon/cpu.map.h>
  50. #endif
  51. #include <mon/cpu.addrs.h>
  52. #include <stand/saio.h>
  53.  
  54. /*
  55.  * Artifice so standalone code uses same variable names as monitor's
  56.  * for debugging.  FIXME?  Or leave this way?
  57.  */
  58. struct globram {
  59.     char *g_nextrawvirt;
  60.     char *g_nextdmaaddr;
  61.     struct pgmapent g_nextmainmap;
  62. } gp[1];
  63.  
  64.  
  65. /*
  66.  * Valid, supervisor-only, memory page's map entry.
  67.  * (To be copied to a map entry and then modified.)
  68.  */
  69. #ifdef sun2
  70. struct pgmapent mainmapinit =
  71.     {1, PMP_SUP, VPM_MEMORY, 0, 0, 0, 0};
  72. #else
  73. struct pgmapent mainmapinit = 
  74.     {1, PMP_SUP, VPM_MEMORY_NOCACHE, 0, 0, 0, 0};
  75. #endif
  76. #if defined (sun3) || defined (sun4)
  77. extern    int    memory_avail;
  78. #endif
  79.  
  80. /*
  81.  * Say Something Here FIXME
  82.  */
  83. char *
  84. resalloc(type, bytes)
  85.     enum RESOURCES type;
  86.     register unsigned bytes;
  87. {
  88.     register char *    addr;    /* Allocated address */
  89.     register char *    raddr;    /* Running addr in loop */
  90.  
  91.     /* Initialize if needed. */
  92.     if (gp->g_nextrawvirt == 0) {
  93. #ifdef sun2
  94.         reset_alloc(0x220000);
  95. #endif
  96. #if defined(sun3) || defined(sun4)
  97.         reset_alloc(memory_avail);
  98. #endif sun3 || sun4
  99.     }
  100.  
  101. #ifdef PD
  102. printf("resalloc(%x, %x) %x %x %x\n", type, bytes,
  103.     gp->g_nextrawvirt, gp->g_nextdmaaddr,*(int*)&(gp->g_nextmainmap));
  104. #endif PD
  105.     if (bytes == 0)
  106.         return (char *)0;
  107.  
  108.     bytes = (bytes + (BYTESPERPG - 1)) & ~(BYTESPERPG - 1);
  109.  
  110.     switch (type) {
  111.  
  112.     case RES_RAWVIRT:
  113.         addr = gp->g_nextrawvirt;
  114.         gp->g_nextrawvirt += bytes;
  115.         return addr;
  116.  
  117.     case RES_DMAVIRT:
  118.         addr = gp->g_nextdmaaddr;
  119.         gp->g_nextdmaaddr += bytes;
  120.         return addr;
  121.  
  122.     case RES_MAINMEM:
  123.         addr = gp->g_nextrawvirt;
  124.         gp->g_nextrawvirt += bytes;
  125.         break;
  126.  
  127.     case RES_DMAMEM:
  128.         addr = gp->g_nextdmaaddr;
  129.         gp->g_nextdmaaddr += bytes;
  130.         break;
  131.  
  132.     default:
  133.         return (char *)0;
  134.     }
  135.     
  136.     /*
  137.      * Now map in main memory.
  138.      * Note that this loop goes backwards!!
  139.      */
  140. #ifdef PD
  141. printf("mapping to %x returning %x gp %x\n", *(int*)&gp->g_nextmainmap, addr, gp);
  142. #endif
  143.     for (raddr = addr;
  144.          bytes > 0;
  145.          raddr += BYTESPERPG, bytes -= BYTESPERPG,
  146.           gp->g_nextmainmap.pm_page -= 1) {
  147.         setpgmap(raddr, *(int *)&gp->g_nextmainmap);
  148.         bzero((caddr_t)raddr, BYTESPERPG);
  149.     } 
  150.  
  151.     return addr;
  152. }
  153.  
  154. #ifdef sun2
  155. struct pgmapent devmaps[] = {
  156. /* MAINMEM */
  157.     {1, PMP_SUP, MPM_MEMORY, 0, 0, 0, 0},        
  158. /* OBIO */
  159.     {1, PMP_SUP, MPM_IO, 0, 0, 0, 0},            
  160. /* MBMEM */
  161.     {1, PMP_SUP, VPM_VME0, 0, 0, 0, 0xFF000000 >> BYTES_PG_SHIFT},        
  162. /* MBIO */
  163.     {1, PMP_SUP, VPM_VME8, 0, 0, 0, 0xFFFF0000 >> BYTES_PG_SHIFT},        
  164. /* VME16A16D */
  165.     {1, PMP_SUP, VPM_VME8, 0, 0, 0, 0xFFFF0000 >> BYTES_PG_SHIFT},        
  166. /* VME16A32D -- invalid */
  167.     {0, PMP_SUP, VPM_VME8, 0, 0, 0, 0xFFFF0000 >> BYTES_PG_SHIFT},        
  168. /* VME24A16D -- kludge low 8 megs only */
  169.     {1, PMP_SUP, VPM_VME0, 0, 0, 0, 0xFF000000 >> BYTES_PG_SHIFT},        
  170. /* VME24A32D -- invalid */
  171.     {0, PMP_SUP, VPM_VME0, 0, 0, 0, 0xFF000000 >> BYTES_PG_SHIFT},        
  172. /* VME32A16D -- invalid */
  173.     {0, PMP_SUP, VPM_VME0, 0, 0, 0, 0x00000000 >> BYTES_PG_SHIFT},        
  174. /* VME32A32D -- invalid */
  175.     {0, PMP_SUP, VPM_VME0, 0, 0, 0, 0x00000000 >> BYTES_PG_SHIFT},        
  176. };
  177. #endif sun2
  178.  
  179. #ifdef sun3
  180. struct pgmapent devmaps[] = {
  181. /* MAINMEM */
  182.     {1, PMP_SUP, VPM_MEMORY, 0, 0, 0, 0},        
  183. /* OBIO */
  184.     {1, PMP_SUP, VPM_IO, 0, 0, 0, 0},            
  185. /* MBMEM */
  186.     {1, PMP_SUP, VPM_VME16, 0, 0, 0, 0xFF000000 >> BYTES_PG_SHIFT},        
  187. /* MBIO */
  188.     {1, PMP_SUP, VPM_VME16, 0, 0, 0, 0xFFFF0000 >> BYTES_PG_SHIFT},        
  189. /* VME16A16D */
  190.     {1, PMP_SUP, VPM_VME16, 0, 0, 0, 0xFFFF0000 >> BYTES_PG_SHIFT},        
  191. /* VME16A32D */
  192.     {1, PMP_SUP, VPM_VME32, 0, 0, 0, 0xFFFF0000 >> BYTES_PG_SHIFT},        
  193. /* VME24A16D */
  194.     {1, PMP_SUP, VPM_VME16, 0, 0, 0, 0xFF000000 >> BYTES_PG_SHIFT},        
  195. /* VME24A32D */
  196.     {1, PMP_SUP, VPM_VME32, 0, 0, 0, 0xFF000000 >> BYTES_PG_SHIFT},        
  197. /* VME32A16D */
  198.     {1, PMP_SUP, VPM_VME16, 0, 0, 0, 0x00000000 >> BYTES_PG_SHIFT},        
  199. /* VME32A32D */
  200.     {1, PMP_SUP, VPM_VME32, 0, 0, 0, 0x00000000 >> BYTES_PG_SHIFT},        
  201. };
  202. #endif sun3
  203.  
  204. #ifdef sun4
  205. struct pgmapent devmaps[] = {
  206. /* MAINMEM */
  207.     {1, PMP_SUP, VPM_MEMORY, 0, 0, 0, 0},        
  208. /* OBIO */
  209.     {1, PMP_SUP, VPM_IO, 0, 0, 0, 0},            
  210. /* MBMEM */
  211.     {1, PMP_SUP, VPM_VME16, 0, 0, 0, 0xFF000000 >> BYTES_PG_SHIFT},        
  212. /* MBIO */
  213.     {1, PMP_SUP, VPM_VME16, 0, 0, 0, 0xFFFF0000 >> BYTES_PG_SHIFT},        
  214. /* VME16A16D */
  215.     {1, PMP_SUP, VPM_VME16, 0, 0, 0, 0xFFFF0000 >> BYTES_PG_SHIFT},        
  216. /* VME16A32D */
  217.     {1, PMP_SUP, VPM_VME32, 0, 0, 0, 0xFFFF0000 >> BYTES_PG_SHIFT},        
  218. /* VME24A16D */
  219.     {1, PMP_SUP, VPM_VME16, 0, 0, 0, 0xFF000000 >> BYTES_PG_SHIFT},        
  220. /* VME24A32D */
  221.     {1, PMP_SUP, VPM_VME32, 0, 0, 0, 0xFF000000 >> BYTES_PG_SHIFT},        
  222. /* VME32A16D */
  223.     {1, PMP_SUP, VPM_VME16, 0, 0, 0, 0x00000000 >> BYTES_PG_SHIFT},        
  224. /* VME32A32D */
  225.     {1, PMP_SUP, VPM_VME32, 0, 0, 0, 0x00000000 >> BYTES_PG_SHIFT},        
  226. };
  227. #endif sun4
  228.  
  229. /*
  230.  * devalloc() allocates virtual memory and maps it to a device
  231.  * at a specific physical address.
  232.  *
  233.  * It returns the virtual address of that physical device.
  234.  */
  235. char *
  236. devalloc(devtype, physaddr, bytes)
  237.     enum MAPTYPES    devtype;
  238.     register char *        physaddr;
  239.     register unsigned    bytes;
  240. {
  241.     char *        addr;
  242.     register char *    raddr;
  243.     register int    pages;
  244.     struct pgmapent    mapper;
  245.  
  246. #ifdef PD
  247. printf("devalloc(%x, %x, %x) ", devtype, physaddr, bytes);
  248. #endif
  249.     if (!bytes)
  250.         return (char *)0;
  251.  
  252.     pages = bytes + ((int)(physaddr) & (BYTESPERPG-1));
  253.     addr = resalloc(RES_RAWVIRT, pages);
  254.     if (!addr)
  255.         return (char *)0;
  256.  
  257.     mapper = devmaps[(int)devtype];        /* Set it up first */
  258.     mapper.pm_page += (int)(physaddr) >> BYTES_PG_SHIFT;
  259.  
  260.     for (raddr = addr;
  261.          pages > 0;
  262.          raddr += BYTESPERPG, pages -= BYTESPERPG,
  263.           mapper.pm_page += 1) {
  264. #ifdef PD
  265. printf("mapping to %x ", *(int *)&mapper);
  266. #endif
  267.         setpgmap(raddr, *(int *)&mapper);
  268.     } 
  269.  
  270. #ifdef PD
  271. printf("returns roughly %x\n", addr);
  272. #endif
  273.     return addr + ((int)(physaddr) & (BYTESPERPG-1));
  274. }
  275.  
  276. /*
  277.  * reset_alloc() does all the setup and all the releasing for the PROMs.
  278.  */
  279. reset_alloc(memsize)
  280.     unsigned memsize;
  281. {
  282. #ifdef sun2
  283.     int    i;
  284.     struct bootparam *bp;
  285.     int    *mem_p;
  286.     int    memory_size;
  287.  
  288.     bp = *(romp->v_bootparam);
  289.     mem_p = (int *)&(bp->bp_strings[96]);
  290.     memory_size = *mem_p;
  291.     if (memory_size)
  292.         memsize = memory_size;
  293.     *mem_p = memory_size + 0x20000;
  294.  
  295.     gp->g_nextrawvirt = (char *)0x160000;
  296. #endif
  297. #ifdef sun3
  298.     int i, addr, pmeg;
  299.  
  300.     gp->g_nextrawvirt = (char *)0x200000;
  301.     /*
  302.      * The monitor only allocates as many PMEGs as there is real
  303.      * memory so we have to set up more PMEGs for virtual memory
  304.      * on machines with only 2 megabytes.
  305.      */
  306.     for (i=0; i < 0x100000; i += PGSPERSEG*BYTESPERPG) {    /* 1 Meg */
  307.         addr = (int)gp->g_nextrawvirt + i;
  308.         pmeg = addr / (PGSPERSEG*BYTESPERPG);
  309.         setsegmap(addr, pmeg);
  310.     }
  311. #endif
  312. #ifdef sun4
  313.     /*
  314.      * The booter loads itself at 2 Meg so we add an extra Meg to
  315.      * get to a place to allocate virtual addresses and still have pmegs.
  316.      * This assumes that the minimum memory size for sun4 is 4 Meg.
  317.      */
  318.     gp->g_nextrawvirt = (char *)0x300000;
  319. #endif sun4
  320.     gp->g_nextdmaaddr = DVMA_BASE;
  321.     gp->g_nextmainmap = mainmapinit;
  322.     gp->g_nextmainmap.pm_page = (memsize>>BYTES_PG_SHIFT) - 1;
  323. #ifdef PD
  324. printf("reset_alloc(%x) %x %x %x\n", memsize, *(int *)&mainmapinit, gp, *(int*)&gp->g_nextmainmap);
  325. #endif
  326. }
  327. @
  328.